package org.practice.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.practice.dao.DaoFactory;
import org.practice.dao.ProductDao;
import org.practice.model.Product;
import org.practice.service.CartService;
import org.practice.service.bo.CartBO;
import org.practice.service.bo.CartItemBO;
import org.practice.util.DaoException;

public class CartServiceImpl implements CartService{
	private static Logger logger = Logger.getLogger(CartServiceImpl.class);
	
	public boolean addCartItem(CartBO cart,Integer productId) throws DaoException {
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		if (!cartItems.containsKey(productId)) {
			ProductDao productDao = DaoFactory.createProductDao();
			Product product = productDao.findProductById(productId);
			CartItemBO item = new CartItemBO();
			item.setProduct(product);
			item.setDrop(false);
			item.setNumber(1);
			cartItems.put(product.getId(), item);
			return true;
		}
		return false;
	}
	public boolean updateNum(CartBO cart,Integer productId, int num) {
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		if (cartItems.containsKey(productId)) {
			if (num <= 0) {
				return drop(cart,productId);
			}
			CartItemBO item = cartItems.get(productId);
			item.setNumber(num);
			return true;
		}
		return false;
	}
	public boolean drop(CartBO cart,Integer productId) {
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		if (cartItems.containsKey(productId)) {
			CartItemBO item = cartItems.get(productId);
			item.setDrop(true);
			return true;
		}
		return false;
	}
	public boolean recovery(CartBO cart,Integer productId) {
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		if (cartItems.containsKey(productId)) {
			CartItemBO item = cartItems.get(productId);
			item.setDrop(false);
			return true;
		}
		return false;
	}
	public void countEffectiveCartItems(CartBO cart) {
		cart.getEffectiveCartItems().clear();
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
//		List<CartItemBO> list=new ArrayList<CartItemBO>();
		Iterator<Integer> it = cartItems.keySet().iterator();
		while (it.hasNext()) {
			CartItemBO item = cartItems.get(it.next());
			if (!item.isDrop()) {
//				list.add(item);
				cart.getEffectiveCartItems().add(item);
			}
		}
	}
	public void countDropCartItems(CartBO cart) {
		cart.getDropCartItems().clear();
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		Iterator<Integer> it = cartItems.keySet().iterator();
		while (it.hasNext()) {
			CartItemBO item = cartItems.get(it.next());
			if (item.isDrop()) {
				cart.getDropCartItems().add(item);
			}
		}
	}
	public void calculateTotalPrice(CartBO cart) {
		Map<Integer, CartItemBO> cartItems = cart.getCartItems();
		double totalPrice = 0;
		Iterator<Integer> it = cartItems.keySet().iterator();
		while (it.hasNext()) {
			CartItemBO item = cartItems.get(it.next());
			if (!item.isDrop()) {
				totalPrice += item.getProduct().getFixedPrice()
						* item.getNumber();
			}
		}
		cart.setTotalPrice(totalPrice);
	}
	public void calculateDangPrice(CartBO cart) {
		Map<Integer, CartItemBO> cartItems = cart.getCartItems();
		double dangPrice = 0;
		Iterator<Integer> it = cartItems.keySet().iterator();
		while (it.hasNext()) {
			CartItemBO item = cartItems.get(it.next());
			if (!item.isDrop()) {
				dangPrice += item.getProduct().getDangPrice()
						* item.getNumber();
			}
		}
		cart.setDangPrice(dangPrice);
	}
	public String generateSerialize(CartBO cart) {
		
		//3@1,1,false;2,1,false;3,2,true
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		StringBuilder buffer = new StringBuilder();
		buffer.append(cart.getUserId()).append("@");
		if (cartItems.isEmpty()) {
			buffer.append("0");
		} else {
			Iterator<Integer> it = cartItems.keySet().iterator();
			while (it.hasNext()) {
				Integer productId = it.next();
				int num = cartItems.get(productId).getNumber();
				boolean drop = cartItems.get(productId).isDrop();
				buffer.append(productId + "," + num + "," + drop);
				buffer.append(";");
			}
		}
		if (buffer.length() > 0)
			buffer.deleteCharAt(buffer.length() - 1);
		logger.debug(buffer);

		return buffer.toString();
	}
	public void load(CartBO cart,String cookieVal) {
		Map<Integer, CartItemBO> cartItems=cart.getCartItems();
		cartItems.clear();
		String userId = cookieVal.substring(0, cookieVal.indexOf("@"));
		if (userId != null && Integer.parseInt(userId) == cart.getUserId()) {
			cookieVal = cookieVal.substring(cookieVal.indexOf("@") + 1);
			if (cookieVal == null || "0".equals(cookieVal))
				return;
			if (cookieVal != null && cookieVal.length() > 0) {
				String[] itemsArry = cookieVal.split(";");
				for (int i = 0; i < itemsArry.length; i++) {
					String[] itemArry = itemsArry[i].split(",");
					logger.debug(Arrays.toString(itemArry));
					Integer id = Integer.valueOf(itemArry[0]);
					int number = Integer.parseInt(itemArry[1]);
					boolean drop = Boolean.parseBoolean(itemArry[2]);
					
					ProductDao productDao = DaoFactory.createProductDao();
					Product product = productDao.findProductById(id);
					CartItemBO item = new CartItemBO();
					item.setProduct(product);
					item.setNumber(number);
					item.setDrop(drop);
					cartItems.put(product.getId(), item);
					logger.debug(cartItems);
				}
			}
		}
	}
	
	public void clear(CartBO cart) {
		cart.getCartItems().clear();
	}
	public boolean isEmpty(CartBO cart) {
		return cart.getCartItems().isEmpty();
	}
}
